iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0

昨天已經把 LineBot 設定好了,今天要做一些簡單的指令,包含一圖文選單,做完之後大概如下圖:

line_image_menu

  1. Line 官方帳號管理頁面,選擇好我們的機器人帳號後,選擇圖文選單 > 建立
    建立圖文選單

  2. 「標題」, 「使用期間」隨意填寫,「選單列顯示文字」選擇「選單」,「預設顯示方式」都可以,我是選「顯示」
    顯示設定

  3. 內容部份,我選擇小型3格的樣式,這邊要準備一張背景圖片,圖片大小在按「上傳背景圖片」的時候,會有支援的格式, 大小。大小的話會就依照大型或小型在同樣的寬度下,會有不同的高度,依照所選的格式才上傳就可以了。
    動作的話,因為我選了3格,所以會有3個選項,這裡設定自己要放入選單的指令,文字部份我用 ”[]“ 括起來,和一般的文字輸入做區分
    圖文選單內容

  4. 再來就是程式碼的部份,延續昨天的程式碼,多引用了 shioaji 進來,並在程式一執行的時候就進行登入。postback 的部份沒有變動,主要還是在 handle_message 的部份加了 action 的判斷。完整程式碼如下

from flask import Flask, request, abort
from linebot import (
   LineBotApi, WebhookHandler 
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, TemplateSendMessage, ButtonsTemplate
)
from linebot.models.actions import MessageAction, PostbackAction, URIAction

# 多引用了 shioaji
import shioaji as sj
from shioaji.data import Snapshot
import re

app = Flask(__name__)

line_bot_api = LineBotApi('CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('CHANNEL_SECRET')

sjApi = sj.Shioaji()
sjApi.login(person_id="身份證字號", passwd="密碼")

# 要執行的指令
action = ""


# callback 基本上沒有動
@app.route("/callback", methods=["POST"])
def callback():
    # get X-LineSignature header value
    signature = request.headers["X-Line-Signature"]

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body:" + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    global action

    # 取得傳入的文字
    msg = event.message.text
    
    # 檢查是不是指令
    regex = re.compile("\[(.+)\]")
    match = regex.match(msg)

    if match:
        # 如果是指令的話,設定下一步要執行的指令
        action = match.group(1)
        # 取得回傳訊息
        reply_msg = getActionReplyMsg()
        
        # 回傳訊息
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=reply_msg)
        )
        # 結束本次執行
        return

    else:
        
        # 執行查詢股票
        if action == "stock":
            reply_msg = queryStock(msg)

            line_bot_api.reply_message(
                event.reply_token,
                TextSendMessage(text=reply_msg)
            )
            return
        
        # 執行查詢期貨
        if action == "future":
            reply_msg = queryFeature(msg)

            line_bot_api.reply_message(
                event.reply_token,
                TextSendMessage(text=reply_msg)
            )
            return


def getActionReplyMsg():
    global action
    if action == "stock":
        return "請輸入股票代碼"
    elif action == "future":
        return "請輸入期貨代碼"
    else:
        action = ""
        return "沒有此指令,請確認後再輸入"
    
def queryStock(stock_code):
    global action
    stock = sjApi.Contracts.Stocks[stock_code.upper()]
    
    if stock == None:
        return "查無此股票代碼 - " + stock_code

    snapshots = sjApi.snapshots([stock])
    
    action = ""

    return snapshots[0].close


def queryFeature(future_code):
    global aciton
    
    future = sjApi.Contracts.Futures[future_code.upper()]
    
    if future == None:
        return "查無此期貨代碼 - " + future_code

    snapshot = sjApi.snapshots([future])
    
    print(snapshot[0])
    
    action = ""
    return snapshot[0].close

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8080, debug=True)

這樣子就可以達成簡單的選單,進行相關的查詢。


上一篇
LineBot - 自動回覆 API
下一篇
LineBot - 身份驗證
系列文
永豐金融APIs - 從零開始到放棄!?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言